package com.java.test;


import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

/**
 * JDK1.8 之前的日期和时间API测试
 * <p>
 * 1.System类中的currentTimeMillis()
 * 2.java.util.Date 和 子类 java.sql.Date
 * 3.simpleDateFormat
 * 4.calender
 *
 * @author shkstart
 */
public class DateTimeTest_2 {
    /*
     * simpleDateFormat的使用:simpleDateFormat的格式化和解析
     *
     * 1.两个操作
     * 1.1：格式化：日期--》字符串
     * 1.2：解析    格式化的逆过程 字符串--》日期
     *
     * 2simpleDateFormat实例化过程
     *
     * */
    @Test
    public void test1() throws ParseException {
        //实例化
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat();

        //格式化日期：  日期--》字符串
        Date date = new Date();
        System.out.println(date);

        System.out.println(simpleDateFormat1.format(date));

        //解析：字符串--》日期
        String s1 = new String("2021/1/6 下午9:43");
        Date date1 = simpleDateFormat1.parse(s1);
        System.out.println(date1);

        System.out.println("---------------------");
        //***********按照带参的构造器进行格式化和解析（开发中用）*********
        //方式二：格式化
        SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date2 = s2.format(date);
        System.out.println(date2);
        //方式二：解析  要求字符串必须符合simpleDateFormat构造器识别的格式（通过构造器参数体现）。否则会抛异常
        Date date3 = s2.parse(date2);
        System.out.println(date3);

        /*
         *
         * 练习一：字符串“2020-09-08”转换为java.sql.Date
         *
         *
         * */

    }

    @Test
    public void exer1() throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入");
        int a = sc.nextInt();
        String s1 = "2020-09-08";
        SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");
        Date d1 = s2.parse(s1);
        java.sql.Date d2 = new java.sql.Date(d1.getTime());
        System.out.println(d2);
    }
    /*
     * 三天打鱼两天晒网   1990-01-01
     *
     * */

    @Test
    public void test2() throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入你要查询的日期");
        String s1 = sc.next();
        show(s1);
    }

    public void show(String str) throws ParseException {
        String s1 = "1990-01-01";
        SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");
        Date d1 = s2.parse(s1);
        Date d2 = s2.parse(str);
        Long time1 = d1.getTime();
        Long time2 = d2.getTime();
        System.out.println(time1);
        System.out.println(time2);

        Long time3 = time2 - time1;
        System.out.println(time3);

        int day = (int) (time3 % (86400000));

        if (day % 5 == 1 | day % 5 == 2 | day % 5 == 3) {
            System.out.println(str + "他在打鱼");
        } else {
            System.out.println(str + "他在晒网");
        }
    }

    /*
     * calendar日历类(抽象类)的使用
     *
     * 缺点：
     *   可变性：像日期时间这样的类应该是不可变的
     *   偏移性：Date中的年份是从1900开始的，而月份都从0 开始的
     *   格式化：格式化只对Date有用，Calender则不行
     *   此外，他们也不是线程安全的；不能处理闰秒等
     *
     * 总结：对日期和时间的操作一直是java程序员最痛苦的地方之一
     *
     * */
    @Test
    public void test3() {
        //实例化
        //方式一：创建其子类gregorianCalendar的对象
        Calendar c1 = new GregorianCalendar();
        System.out.println(c1.getTime());  //Tue Jan 12 10:38:39 CST 2021
        //方式二：调用其静态方法getInstance()  其实创建的还是子类的对象  但是在开发中经常使用方式二
        Calendar c2 = Calendar.getInstance();
//        System.out.println(c2.getClass());  //GregorianCalendar

        //2.常用方法
        //get()
        int time1 = c2.get(Calendar.DAY_OF_WEEK_IN_MONTH);
        System.out.println(time1);
        System.out.println(c2.get(Calendar.DAY_OF_YEAR));
        //set()
        c2.set(Calendar.DAY_OF_MONTH, 5);
        time1 = c2.get(Calendar.DAY_OF_MONTH);
        System.out.println(time1);

        //add()
        //Calendar是可变的
        c2.add(Calendar.DAY_OF_YEAR, 2);
        time1 = c2.get(Calendar.DAY_OF_YEAR);
        System.out.println(time1);

        //getTime()  日历类--》Date
        Date d1 = c2.getTime();
        System.out.println(d1);

        //setTime() Date--》日历类
        Date d2 = new Date();
        c2.setTime(d2);
        int time2 = c2.get(Calendar.DAY_OF_YEAR);
        System.out.println(time2);

    }

}

